/*
首先我们考虑设计状态。我们发现，为了保证无后效性的一位一位往后推，我们需要记录当前推到a串的哪一个位置了；
接着还有记录匹配了b串的那几个字符。因为是按照原串顺序，所以相当于是即匹配b的前几个字符。
有这些还不够，我们还要记录划分了几个子串。
最后，为了便于转移，我们还要标记一维0/1状态，表示a串中的第i个字符是否选入。
这样，我们就设计好了状态。我们记f[i,j,p,v]表示到a串的第i个位置为止使用p个子串匹配b串前j位字符且第i个位置选或不选（v）的方案数。
*/
#include<bits/stdc++.h>
#define ONLINE_JUDGE
#define ll long long
#define ull unsigned long long
using namespace std;

const ll N = 1e6 + 10, M = 210, MOD = 1000000007;

ll n, m, k;
string s, t;
ll f[2][M][M][2];

void solve()
{
    cin >> n >> m >> k >> s >> t;
    s = " " + s;t = " " + t;
    ll now = 0;
    f[0][0][0][0] = f[1][0][0][0] = 1;
    for (ll i = 1;i <= n;i++) {
        for (ll j = 1;j <= m;j++)
            for (ll p = 1;p <= k;p++) {
                if (s[i] == t[j]) {
                    f[now][j][p][0] = (f[now ^ 1][j][p][0] + f[now ^ 1][j][p][1]) % MOD;
                    f[now][j][p][1] = (f[now ^ 1][j - 1][p - 1][0] + f[now ^ 1][j - 1][p][1] + f[now ^ 1][j - 1][p - 1][1]) % MOD;
                } else {
                    f[now][j][p][0] = (f[now ^ 1][j][p][1] + f[now ^ 1][j][p][0]) % MOD;
                    f[now][j][p][1] = 0;
                }
            }
        now = now ^ 1;
    }
    now = now ^ 1;
    cout << (f[now][m][k][0] + f[now][m][k][1]) % MOD;
}

signed main()
{
    // ios::sync_with_stdio(0);
    // cin.tie(0);cout.tie(0);
#ifndef ONLINE_JUDGE
    std::istringstream in(R"()");
    std::cin.rdbuf(in.rdbuf());
#endif
    ll T = 1;
    //cin>>T;
    for (ll i = 1;i <= T;i++) {
        solve();
    }
}